package io.stn;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

//첫번째 예제
public class StandardIOTest {
	/**
	 * 표준 입출력에 관한 클래스 
	 * 표준 입력 - 키보드 System.in : InputStream
	 * 표준 출력 - 화면 System.out/System.err : PrintStream
	 * 
	 * 
	 */
	public static void main(String[] args) throws IOException{
		System.out.println("글을 입력 하세요.");//표준 출력
//		InputStream is = System.in;//왜 시스템 아웃 쓰듯이 못쓰지?
		//int c = System.in.read()//위랑 아래를 합치면 이렇게 써도 된다. 근데 사실 이렇게는 쓸일이 없다. 1바이트 읽어서 어따쓸래?
//		int c = is.read();//1byte input - 연결된 외부자원이 출력을 하지 않으면 입력받을 값이 올때 까지 기다린다.
		// 바로 이렇게 읽을 값을 기다리는 것을 IO Blocking이라고 한다. 
//		System.out.println("읽은 값 : "+(char)c);//읽은 값은 뭐지? 일정하다. 
		
		/*
		 * Filter Stream : 
		 * byte 계열 -> character 계열로 변환
		 * InputStreamReader >이름 그대로 인풋 스트림을 리더스트림으로 변환해주는 역할을 함
		 * OutputStreamWriter -> 아웃풋 스트림을 Writer로 변환해주는 역할 API를 보자. 
		 * 생성자를 보면 인풋스트림을 매개변수로 받아 그걸 리더로 변환해준다. Api를 확인하자.
		 * 근데 OUtputStreamWriter를 쓸 일은 거의 없다. 그냥 프린트라이터를 사용한다. 프린트라이터 안에 내부적으로 이런 기능이 이미 구현되어 있기 때문이다.
		 */
		
		BufferedReader br = null;//최종적인 버퍼드 리더만 클로즈 하면 되니까 밖에다가 일단 선언
	
		try{
		InputStream is = System.in;
		InputStreamReader ir = new InputStreamReader(is);
		br = new BufferedReader(ir);
		//br = new BufferedReader(new InputStreamReader(System.in));
		//한줄로 처리하면 이렇게 되고 사실 다 이렇게 쓴다.
		//졸라 복잡하네
				//인풋 스트림을 노드에 인풋 스트림리더 필터를 붙이고 다시 여기에 버퍼드 리더 필터를 최종적으로 붙인거다. 
				//왜냐 API를 봐라. 생성자를 바로 붙일 수가 없어서...뭔소린지 정리하자. 
				//버퍼드리더는 인풋 스트림에 바로 못 붙인다. 그래서 중간 단계가 있는거다. 기능을 조금씩 계속 추가한거다. 
				//br.하고 버퍼드리더 메소드 사용하고, ir.하고 인풋스트림리더 메소드도 사용가능하다.
				//근데 클로즈는 br 최종단계만 하면 된다.
			
			System.out.println("종료 : ctr -z");
			String str = br.readLine();//라인단위로 입력을 받는 메소드. 그러니까 당연히 스트링
			while(str != null){
				System.out.println("입력내용 : " + str);
				str = br.readLine();
			}
			}finally {
				if(br != null) br.close();
			}
		}
}
		
	
